Оператор switch

Оператор switch используется для выбора одного из нескольких блоков кода на основе значения выражения. Он особенно удобен, когда нужно проверить переменную на равенство нескольким дискретным значениям.

Синтаксис

switch (выражение) {
  case значение1:
    // код, если выражение === значение1
    break;
  case значение2:
    // код, если выражение === значение2
    break;
  default:
    // код, если ни одно значение не совпало (необязательно)
}

Принцип работы

switch сравнивает значение выражения с каждым case с помощью строгого сравнения (===) — то есть и тип, и значение должны совпадать.

Пример: выбор языка интерфейса

const language = "ru";

switch (language) {
  case "en":
    setLanguage("English");
    break;
  case "ru":
    setLanguage("Русский");
    break;
  case "es":
    setLanguage("Español");
    break;
  default:
    setLanguage("English"); // запасной вариант
}

Здесь language сравнивается со строками "en", "ru", "es". Если совпадает — выполняется соответствующий блок, и break останавливает выполнение.

Почему нужен break?

Без break выполнение продолжается на следующие case — это называется просачиванием (fall-through).

Пример с ошибкой:

const role = "admin";

switch (role) {
  case "admin":
    console.log("Администратор");
  case "moderator":
    console.log("Модератор");
  case "user":
    console.log("Пользователь");
  default:
    console.log("Гость");
}

Вывод:

Администратор
Модератор
Пользователь
Гость

Потому что после case "admin": нет break — выполнение «просочилось» дальше.

Это может быть полезно в редких случаях — например, когда несколько значений должны делать одно и то же:

const permission = "read";

switch (permission) {
  case "read":
  case "write":
  case "delete":
    enableButton("action");
    break;
  default:
    disableButton("action");
}

Здесь если permission — "read", "write" или "delete" — кнопка включается. Это читаемо и логично.

default — обработка неожиданных значений

default не обязателен, но рекомендуется всегда добавлять. Он обрабатывает случаи, когда значение не совпало ни с одним case.

Пример: обработка типов уведомлений

const notificationType = "error"; // пришло из API

switch (notificationType) {
  case "success":
    showBanner("Успешно!", "green");
    break;
  case "warning":
    showBanner("Предупреждение!", "orange");
    break;
  case "error":
    showBanner("Ошибка!", "red");
    break;
  default:
    console.warn("Неизвестный тип уведомления:", notificationType);
    showBanner("Новое сообщение", "blue");
}

Здесь даже если сервер отправит неожиданный тип — приложение не сломается, а просто покажет стандартное сообщение и залогирует проблему.

Когда использовать switch

✅ Используйте switch, когда:

  • Проверяете одну переменную на равенство нескольким конкретным значениям.
  • Значения — строковые константы, числа, перечисления (enum).
  • Код должен быть структурирован и легко расширяться.

❌ Не используйте switch, когда:

  • Нужно проверять диапазоны (if (score >= 90)).
  • Условия сложные (if (user.age > 18 && user.role === "admin")).
  • Вы сравниваете объекты или массивы — switch работает только с примитивами.

Важно

  • switch работает только с примитивами: строки, числа, булевы, null, undefined, символы.
  • case не может быть выражением — только литералы или константы.
  • Все case должны быть уникальными в рамках одного switch.

Пример запрещённого:

switch (x) {
  case y + 1: // ОШИБКА — выражение не допускается
    break;
}